package dao;

import banco.ConnectionDB;
import java.awt.Frame;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import model.Fornecedor;

public class FornecedorDAOImp implements GenericDAOImp<Fornecedor> {

    private Frame frame;
    private Connection connection;

    public FornecedorDAOImp(Frame frame) {
        this.frame = frame;

        connection = new ConnectionDB().getConnection();
    }

    @Override
    public void adiciona(Fornecedor fornecedor) {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "INSERT INTO fornecedor (fornecedor_ID, nome, cnpj, porteempresa, endereco, telefone, cep, uf, bairro, "
                    + "foto_fornecedor) "
                    + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");

            statement.setInt(1, fornecedor.getFornecedorID());
            statement.setString(2, fornecedor.getNome());
            statement.setString(3, fornecedor.getCnpj());
            statement.setString(4, fornecedor.getPorteempresa());
            statement.setString(5, fornecedor.getEndereco());
            statement.setString(6, fornecedor.getTelefone());
            statement.setString(7, fornecedor.getCep());
            statement.setString(8, fornecedor.getUf());
            statement.setString(9, fornecedor.getBairro());
            statement.setString(10, fornecedor.getCaminhoFoto());

            statement.execute();
            statement.close();
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public void altera(Fornecedor fornecedor) {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "UPDATE fornecedor SET nome = ?, "
                    + "cnpj = ?, porteempresa = ?, "
                    + "endereco = ?, telefone = ?, "
                    + "cep = ?, uf = ?, "
                    + "bairro = ?, "
                    + "foto_fornecedor = ? "
                    + "WHERE fornecedor_ID = ?");

            statement.setString(1, fornecedor.getNome());
            statement.setString(2, fornecedor.getCnpj());
            statement.setString(3, fornecedor.getPorteempresa());
            statement.setString(4, fornecedor.getEndereco());
            statement.setString(5, fornecedor.getTelefone());
            statement.setString(6, fornecedor.getCep());
            statement.setString(7, fornecedor.getUf());
            statement.setString(8, fornecedor.getBairro());
            statement.setString(9, fornecedor.getCaminhoFoto());
            statement.setInt(10, fornecedor.getFornecedorID());

            statement.execute();
            statement.close();
        } catch (SQLException sQLException) {
            System.out.println("Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public void remove(Object iD) {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "DELETE FROM fornecedor "
                    + "WHERE fornecedor_ID = ?");

            statement.setObject(1, iD);

            statement.execute();
            statement.close();
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public Fornecedor listaPorID(Object iD) {
        try {
            Fornecedor fornecedor = null;
            PreparedStatement statement = connection.prepareStatement(
                    "SELECT nome, cnpj, porteempresa, endereco, telefone, cep, uf, bairro, "
                    + "foto_fornecedor "
                    + "FROM fornecedor "
                    + "WHERE fornecedor_ID = ?");

            statement.setObject(1, iD);

            ResultSet resultSet = statement.executeQuery();

            if (resultSet.next()) {

                fornecedor = new Fornecedor();
                fornecedor.setFornecedorID((Integer) iD);
                fornecedor.setNome(resultSet.getString(1));
                fornecedor.setCnpj(resultSet.getString(2));
                fornecedor.setPorteempresa(resultSet.getString(3));
                fornecedor.setEndereco(resultSet.getString(4));
                fornecedor.setTelefone(resultSet.getString(5));
                fornecedor.setCep(resultSet.getString(6));
                fornecedor.setUf(resultSet.getString(7));
                fornecedor.setBairro(resultSet.getString(8));
                fornecedor.setCaminhoFoto(resultSet.getString(9));
            }

            resultSet.close();
            statement.close();

            return fornecedor;
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public Fornecedor consultaSeta(String iD, int seta) {
        try {
            Fornecedor fornecedor = null;
            String query = "SELECT fornecedor_ID, nome, cnpj, porteempresa, endereco, telefone, cep, uf, bairro, "
                    + "foto_fornecedor "
                    + "FROM fornecedor ";
            PreparedStatement statement = null;

            switch (seta) {
                case 1:
                    statement = connection.prepareStatement(
                            query + "ORDER BY fornecedor_ID;");

                    break;
                case 2:
                    statement = connection.prepareStatement(
                            query + "WHERE fornecedor_ID < ? "
                            + "ORDER BY fornecedor_ID DESC;");

                    statement.setString(1, iD);

                    break;
                case 3:
                    statement = connection.prepareStatement(
                            query + "WHERE fornecedor_ID > ? "
                            + "ORDER BY fornecedor_ID;");

                    statement.setString(1, iD);

                    break;
                case 4:
                    statement = connection.prepareStatement(
                            query + "ORDER BY fornecedor_ID DESC;");

                    break;
            }

            ResultSet resultSet = statement.executeQuery();

            if (resultSet.next()) {

                fornecedor = new Fornecedor();

                fornecedor.setFornecedorID(resultSet.getInt(1));
                fornecedor.setNome(resultSet.getString(2));
                fornecedor.setCnpj(resultSet.getString(3));
                fornecedor.setPorteempresa(resultSet.getString(4));
                fornecedor.setEndereco(resultSet.getString(5));
                fornecedor.setTelefone(resultSet.getString(6));
                fornecedor.setCep(resultSet.getString(7));
                fornecedor.setUf(resultSet.getString(8));
                fornecedor.setBairro(resultSet.getString(9));
                fornecedor.setCaminhoFoto(resultSet.getString(10));
            }

            resultSet.close();
            statement.close();

            return fornecedor;
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame,
                    "Erro ao executar comando no banco de dados!\n"
                    + "O programa vai ser fechado.\n\nErro ocorrido:\n"
                    + sQLException.getMessage());

            System.exit(0);

            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public List<Fornecedor> listaTudo() {
        try {
            List<Fornecedor> fornecedors = new ArrayList<Fornecedor>();

            PreparedStatement statement = connection.prepareStatement(
                    "SELECT nome, cnpj, porteempresa, endereco, telefone, cep, uf, bairro, "
                    + "foto_fornecedor "
                    + "FROM fornecedor "
                    + "ORDER BY fornecedor_ID");

            ResultSet resultSet = statement.executeQuery();

            while (resultSet.next()) {

                Fornecedor fornecedor = new Fornecedor();

                fornecedor.setNome(resultSet.getString(1));
                fornecedor.setCnpj(resultSet.getString(2));
                fornecedor.setPorteempresa(resultSet.getString(3));
                fornecedor.setEndereco(resultSet.getString(4));
                fornecedor.setTelefone(resultSet.getString(5));
                fornecedor.setCep(resultSet.getString(6));
                fornecedor.setUf(resultSet.getString(7));
                fornecedor.setBairro(resultSet.getString(8));

                fornecedors.add(fornecedor);
            }

            resultSet.close();
            statement.close();

            return fornecedors;
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }

    @Override
    public int consultaProximoID() {
        try {
            PreparedStatement statement = connection.prepareStatement(
                    "SELECT * "
                    + "FROM fornecedor "
                    + "ORDER BY fornecedor_ID DESC");

            ResultSet resultSet = statement.executeQuery();

            if (resultSet.next()) {
                return resultSet.getInt(1) + 1;
            }

            resultSet.close();
            statement.close();

            return 1;
        } catch (SQLException sQLException) {
            JOptionPane.showMessageDialog(frame, "Erro ao executar comando no banco de dados!\n"
                    + sQLException.getMessage());
            throw new RuntimeException(sQLException);
        }
    }
}
